// Copyright (C) 2007  Luciano Santos e Ian Schechtman
package br.unb.cic.algostep.controlador;

import java.util.ArrayList;

import javax.swing.JButton;

import br.unb.cic.algostep.IEstado;
import br.unb.cic.algostep.leitor.Estado;

public class Controlador {
	/*Botões de navegação.*/
	private JButton btnAnt;
	private JButton btnProx;
	
	private IEstado mostrador;
	private IEstado editor;
	private IEstado console;
	private IEstado ga;
	
	/*Lista dos estados.*/
	ArrayList<Estado> estados = new ArrayList<Estado>();
	
	/*Índice para controle da lista de estados. */
	private int indice;
	
	public Controlador(ArrayList<Estado> estados,
	                IEstado mostrador, IEstado ga,
	                IEstado editor, IEstado console,
	                JButton btnAnt, JButton btnProx) {
	    if(estados != null){
	            this.estados = estados;
	    }
	
	    indice = -1;
	
	    this.mostrador = mostrador;
	    this.ga = ga;
	    this.editor = editor;
	    this.console = console;
	    
	    mostrador.setEstado(null);
	    ga.setEstado(null);
        editor.setEstado(null);
        console.setEstado(null);
        
	    /*Botão para estado anterior.*/
	    this.btnAnt = btnAnt;
	    /*Cria evento.*/
	    btnAnt.addActionListener(new java.awt.event.ActionListener() {
	    public void actionPerformed(java.awt.event.ActionEvent evt) {
		        antEstado();
		    }
		});
	
        /*Botão para próximo estado.*/
        this.btnProx = btnProx;
        /*Cria evento.*/
        btnProx.addActionListener(new java.awt.event.ActionListener() {
		    public void actionPerformed(java.awt.event.ActionEvent evt) {
		        proxEstado();
		    }
		});
        
        ajustarBotoes();
	}
	
	private void ajustarBotoes(){
		/* Ativar/desativar botão "Anterior" */
		btnAnt.setEnabled(indice > 0);
		
		/* Ativar/desativar botão "Próximo" */
		btnProx.setEnabled(indice < estados.size()-1);
		
		/* Definir título do botão "Próximo" */
		btnProx.setText(indice < 0 ? "Iniciar" : "Próximo");
	}
        
	private void setEstado(Estado e){
		mostrador.setEstado(e.EstadoMostrador);
		editor.setEstado(e.EstadoTexto);
		console.setEstado(e.EstadoConsole);
		ga.setEstado(e.Estadoga);
		ajustarBotoes();
	}
        
	public void proxEstado (){
		if(indice < estados.size()-1){
			Estado e = (Estado) estados.get(++indice);
			setEstado(e);
		}
	}
	
	public void antEstado (){
		if((indice > 0)){
			Estado e = (Estado) estados.get(--indice);
			setEstado(e);
		}
	}
}
